package cn.cxq.learning.recursion;

import org.junit.jupiter.api.Test;

/**
 * 剑指offer
 * 斐波那契数列
 * 时间限制：C/C++ 1秒，其他语言2秒 空间限制：C/C++ 64M，其他语言128M 热度指数：1060706
 * 本题知识点： 数组
 * 算法知识视频讲解
 * 题目描述
 * 大家都知道斐波那契数列，现在要求输入一个整数n，请你输出斐波那契数列的第n项（从0开始，第0项为0，第1项是1）。
 * 示例1
 * 输入
 * 4
 * 返回值
 * 3
 */
public class Fibonacci {

    @Test
    public void test() {
        System.out.println(Fibonacci(4));
    }

    // 滚动数组
    public int Fibonacci(int n) {
        if (n == 0 || n == 1) {
            return n;
        }

        int pre = 1;
        int prePre = 0;
        int result = pre + prePre;

        for (int i = 2; i <= n; i++) {
            result = pre + prePre;
            prePre = pre;
            pre = result;
        }
        return result;
    }

    // 动态规划
//    public int Fibonacci(int n) {
//
//        if (n == 0) {
//            return 0;
//        }
//
//        int[] dp = new int[n + 1];
//        dp[0] = 0;
//        dp[1] = 1;
//        for (int i = 2; i <= n; i++) {
//            dp[i] = dp[i - 1] + dp[i - 2];
//        }
//        return dp[n];
//    }

    // 递归方法解决
//    public int Fibonacci(int n) {
//        if (n == 0) {
//            return 0;
//        }
//
//        if (n == 1) {
//            return 1;
//        }
//
//        return Fibonacci(n - 1) + Fibonacci(n - 2);
//    }
}
